package com.lingjtx.common.security.strategy;


import com.lingjtx.common.core.RedisOptions;
import com.lingjtx.common.core.ResponseCode;
import com.lingjtx.common.core.ResponseResult;
import com.lingjtx.common.core.constant.RedisConfig;
import com.lingjtx.common.core.util.StringUtil;
import com.lingjtx.common.other.helper.WeiXinOauth;
import com.lingjtx.common.core.token.AuthToken;
import com.lingjtx.common.core.token.UserDetail;

/**
 * 未登录状态有三种：一是从来没有登陆过，二是登录过，刷新token都已经过期；三是退出登录了（token有效）
 * <p>
 * token设置为单账号在线，账号新登录，之前账号即下线，token缓存删除
 * 后期，做电脑和手机app共同在线的话，token的payload设置"aud":"用户登录的平台（PC,Android,iOS,小程序）"
 * 1、 先判断缓存中有没有key为uuid的access_token缓存，有的话删除
 * 2、 设置key为access_token的缓存用户信息，缓存refresh_token，并设置access_token有效期（有效期为refresh_token的有效期）
 * </p>
 */
public class NotLoginStrategy extends TokenStateHandler {

    private RedisOptions redis;

    public RedisOptions getRedis() {
        return redis;
    }

    public void setRedis(RedisOptions redis) {
        this.redis = redis;
    }

    @Override
    public ResponseResult<Object> retError() {
        return ResponseResult.createByError(ResponseCode.NOT_LOGIN, WeiXinOauth.INSTANCE.getBaseWeixinOauthUrl(redis));
    }

    @Override
    public boolean handler(RedisOptions redis, String token) {
        if (StringUtil.isNotEmpty(token)) {
            UserDetail userDetail = AuthToken.getUser(token);
            if (userDetail != null && redis.exists(RedisConfig.KEY_USER_TOKEN + userDetail.getUserId())) { // 刷新token有效
                return true;
            }
        }
        setRedis(redis);
        return false;
    }
}
